﻿/*
 * thpool.h
 *
 *  Created on: 2013-11-1
 *      Author: admin
 */

#ifndef THPOOL_H_
#define THPOOL_H_

#include <vector>
#include <map>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>

namespace n
{

/**
 * @brief 线程池类，管理线程池中的线池，为
 * 线池分配任务
 *
 * 线程池中创建一到多个poolth对象，线程池的任务放在一个队列中，这个队列需要一个
 * 互斥量进行保护，而且，各poolth对象还需要监听一个条件变量，以在队列中放入数据
 * 时被唤醒来执行任务。
 * client放入的每个任务，都是一个std::function对象，
 */
class thpool
{
public:
	thpool();
    virtual ~thpool();

    //设置线程的数量并创建相应的线程
    void init(size_t n) throw();

    //添加一个任务，返回任务的id，以后可以用id取消任务
	size_t push_task(const std::function<void(void)>& );

	void pause();
	void resume();

protected:
	bool pupup_task(std::function<void(void)>&);
	static void th_founction(thpool*);

    std::vector<std::thread> m_threads;//池中的线程们
    std::map< size_t,std::function<void(void)> > m_tasks; //要执行的任务们

    //所有线程共享以下几个同步对象
    //std::mutex m_tasks_mutex;
    std::mutex m_cv_mutex; //读写锁
    std::condition_variable m_cv;

	size_t m_cur_task_id;
};

} /* namespace n */
#endif /* THPOOL_H_ */
